// 进行axiox的二次封装：使用请求与响应拦截器
import axios from "axios";
// 消息组件
import { ElMessage } from "element-plus";

// 1. 利用axios对象的create方法，去创建axios实例（配置请求的其他配置：基础路径、超时时间）
const request = axios.create({
  // 基础路径
  baseURL: import.meta.env.VITE_APP_BASE_API,
  // 超时时间
  timeout: 20000,
});

// 2. 请求与响应的拦截器
request.interceptors.request.use((config) => {
  // config 配置对象，headers属性为请求头，给服务器端携带公共参数
  // 返回配置对象
  return config;
});

// 3. 响应拦截器
request.interceptors.response.use(
  (response) => {
    // 成功回调
    // 简化数据
    return response.data;
  },
  (error) => {
    console.log('error ......................');
    console.log(error);
    // 失败回调：处理http网络错误
    // 定义一个变量：存储网络错误信息
    let errorMsg = "";
    // http 状态码
    const status = error.response.status;
    switch (status) {
      case 400:
        errorMsg = "请求参数错误";
        break;
      case 401:
        errorMsg = "TOKEN过期";
        break;
      case 403:
        errorMsg = "跨域拒绝访问";
        break;
      case 404:
        errorMsg = "请求地址出错";
        break;
      case 408:
        errorMsg = "请求超时";
        break;
      case 500:
        errorMsg = "服务器内部错误";
        break;
      case 501:
        errorMsg = "服务未实现";
        break;
      case 502:
        errorMsg = "网关错误";
        break;
      case 503:
        errorMsg = "服务不可用";
        break;
      case 504:
        errorMsg = "网关超时";
        break;
      case 505:
        errorMsg = "HTTP版本不受支持";
        break;
      default:
        errorMsg = error.response.message;
        break;
    }
    // 提示错误信息
    ElMessage({
      type: 'error',
      message: errorMsg
    })
    // 返回一个失败的Promise：终结Promise回调
    return Promise.reject(error);
  },
);

// 对外暴露
export default request;